CloudFormationで、Metric Mathを使用してダウンタイムを設定したCloudWatchアラームを作成する
データアナリティクス事業本部の鈴木です。
今回は、CloudFormationで作成したCloudWatchアラームのダウンタイム(特定期間の発報抑止)をMetric Mathを使用して設定してみたので、まとめてみました。
手動での設定は分かりやすい記事が多くありますが、CloudFormationから作成する方法の文献が意外と少なく、公式ドキュメントを見つつ試行錯誤したので、設定例やポイントと思ったところを記載しました。
なお、Metric Mathを使ってCloudWatchアラームのダウンタイムを設定しようというアイデアは、こちらの記事を参考にしています。
CloudWatch アラームのダウンタイム(特定期間の発報抑止)を Metric Math を使用して実現してみた | DevelopersIO
作成したCloudFormationテンプレート
検証用の構成
CloudFormationを使って、以下のような構成を作成します。イメージとしては、デッドレターキューをCloudWatchアラームで監視していて、ある特定の時間は理由があってアラートが起きないようにしたい、というような想定です。
テンプレート
以下のテンプレートを使って、実験用のリソースを作成しました。
AWSTemplateFormatVersion: 2010-09-09 Description: SQS Standard Queue with alerm Parameters: QueueName: Description: Name for queue Type: String SNSTopicName: Description: SNSTopicName for Alarm Type: String Resources: # メトリック作成用のリソース ## SQSキュー SQSQueue: Type: AWS::SQS::Queue Properties: MessageRetentionPeriod: 1209600 QueueName: !Sub ${QueueName} VisibilityTimeout: 120 # Metric Math実験用のリソース ## CloudWatch アラーム SQSAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: !Sub ${QueueName}-alerm ComparisonOperator: GreaterThanOrEqualToThreshold DatapointsToAlarm: 1 EvaluationPeriods: 1 Threshold: 1 Metrics: - Expression: IF((HOUR(m1)==4),0,m1) Id: result Label: fixed_approximate_number_of_messages_visible ReturnData: true - Id: m1 Label: approximate_number_of_messages_visible MetricStat: Metric: MetricName: ApproximateNumberOfMessagesVisible Dimensions: - Name: QueueName Value: !Sub ${QueueName} Namespace: AWS/SQS Period: 60 Stat: Average ReturnData: false TreatMissingData: notBreaching
ポイントと思った点はハイライトした箇所になります。
JSTの13時の間は0
になるfixed_approximate_number_of_messages_visible
というラベルのメトリックをCloudWatchの機能で計算し、アラームで監視しています。
詳しくは次のセクションで説明します。
ポイント
AWS::CloudWatch::Alarmのドキュメントに沿って進めていきます。より詳しくは、ドキュメントも併せてご確認ください。
Metric Mathの内容はMetricsキーを使って表現します。Metrics
キーには数式の表現や、数式で計算するメトリックの取得方法を持たせます。Metrics
キーと同時に使えないキーがあることにご注意ください。
Metrics
キーにはMetricDataQueryのリストを与えます。
MetricDataQuery
を記載する際には、以下がポイントと思いました。
Expression
とMetricStat
:指定することで、数式なのか単に数式で使うメトリクスを取得しているだけなのか区別します。Id
とLabel
:Id
は数式を使う際には、数式内でメトリックを表す変数の命名となるようです。命名には小文字から始まるなど、ルールがあるので注意が必要です。Label
は人間が分かるように付けられる名前です。ReturnData
:Expression
の場合はTrue
、MetricStat
の場合はFalse
を指定します。
テンプレートでは、以下の箇所になります。
# sample_template.ymlの抜粋 Metrics: - Expression: IF((HOUR(m1)==4),0,m1) Id: result Label: fixed_approximate_number_of_messages_visible ReturnData: true - Id: m1 Label: approximate_number_of_messages_visible MetricStat: Metric: MetricName: ApproximateNumberOfMessagesVisible Dimensions: - Name: QueueName Value: !Sub ${QueueName} Namespace: AWS/SQS Period: 60 Stat: Average ReturnData: false
また、MetricStatは、さらにどのメトリックを取得するであったり、取得の方法を記載することができます。
Metric
:取得するメトリックを指定できます。Period
:数式に渡すデータの頻度を設定できます。MetricDataQuery
にも同じ項目がありますが、今回はMetricStat
側のみ設定しました。Stat
:数式に渡すメトリックの統計量です。CloudWatch statistics definitionsに記載のある項目を指定できました。
テンプレートでは、以下の箇所になります。
# sample_template.ymlの抜粋 MetricStat: Metric: MetricName: ApproximateNumberOfMessagesVisible Dimensions: - Name: QueueName Value: !Sub ${QueueName} Namespace: AWS/SQS Period: 60 Stat: Average
やってみた
テンプレートをデプロイして、メトリックの様子を観察しました。
キューにはあらかじめ適当なメッセージを1件入れておき、アラームをアラーム状態にしておきます。
数式をIF((HOUR(m1)==4),0,m1)
としているため、4時(JSTだと13時)には値が0になります。これにより、閾値との兼ね合いで、アラーム状態がOK状態に一時的に遷移するはずです。
アラームの状態は以下のようになり、期待通りに動作していることが確認できました。
最後に
今回は、CloudFormationから、Metric Mathを使用してダウンタイムを設定したCloudWatchアラームの作成方法をご紹介しました。
Metric Mathを使用すると、ダウンタイム設定意外にもいろいろなことが実現できると思いますが、そのような際にも作成方法が参考になれば幸いです。